package com.kkd.kkdapp.view;

import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.VelocityTracker;
import android.view.ViewParent;

import com.kkd.kkdapp.utils.SystemUtils;

public class ForListViewPager extends ViewPager {

	public ForListViewPager(Context context) {
		super(context);
		XDISTANCE_MIN = SystemUtils.dip2px(getContext(), 20);
		YDISTANCE_MIN = SystemUtils.dip2px(getContext(), 50);
	}

	public ForListViewPager(Context context, AttributeSet attrs) {
		super(context, attrs);
		XDISTANCE_MIN = SystemUtils.dip2px(getContext(), 20);
		YDISTANCE_MIN = SystemUtils.dip2px(getContext(), 50);
	}

	// 手指上下滑动时的最小速度
	private static final int YSPEED_MIN = 1500;

	// 手指向右滑动时的最小距离
	private static int XDISTANCE_MIN;

	// 手指向上滑或下滑时的最小距离
	private static int YDISTANCE_MIN;
	// 记录手指按下时的横坐标。
	private float xDown;

	// 记录手指按下时的纵坐标。
	private float yDown;

	// 记录手指移动时的横坐标。
	private float xMove;

	// 记录手指移动时的纵坐标。
	private float yMove;

	// 用于计算手指滑动的速度。
	private VelocityTracker mVelocityTracker;

	/*
	 * (non-Javadoc) 避免父控件拦截touch事件
	 */
	@Override
	public boolean dispatchTouchEvent(MotionEvent event) {
		try {
			createVelocityTracker(event);
			switch (event.getAction()) {
			case MotionEvent.ACTION_DOWN:
				xDown = event.getRawX();
				yDown = event.getRawY();
				break;
			case MotionEvent.ACTION_MOVE:
				xMove = event.getRawX();
				yMove = event.getRawY();
				// 滑动的距离
				int distanceX = (int) (xMove - xDown);
				int distanceY = (int) (yMove - yDown);
				// 获取顺时速度
				int ySpeed = getScrollVelocity();
				// 1.x轴滑动的距离>XDISTANCE_MIN
				// 2.y轴滑动的距离在YDISTANCE_MIN范围内
				// 3.y轴上（即上下滑动的速度）<XSPEED_MIN，如果大于，则认为用户意图是在上下滑动而非左滑结束Activity
				if (Math.abs(distanceX) > XDISTANCE_MIN
						&& Math.abs(distanceY) < YDISTANCE_MIN
						&& ySpeed < YSPEED_MIN) {
					ViewParent parent = getParent();
					while (parent != null) {
						parent.requestDisallowInterceptTouchEvent(true);
						parent = parent.getParent();
					}
				}

				break;
			case MotionEvent.ACTION_UP:
				recycleVelocityTracker();
				break;
			default:
				break;
			}
			return super.dispatchTouchEvent(event);
		} catch (Exception e) {

		}
		return false;
	}

	/**
	 * 创建VelocityTracker对象，并将触摸界面的滑动事件加入到VelocityTracker当中。
	 * 
	 * @param event
	 * 
	 */
	private void createVelocityTracker(MotionEvent event) {
		if (mVelocityTracker == null) {
			mVelocityTracker = VelocityTracker.obtain();
		}
		mVelocityTracker.addMovement(event);
	}

	/**
	 * 回收VelocityTracker对象。
	 */
	private void recycleVelocityTracker() {
		if (mVelocityTracker != null) {
			mVelocityTracker.recycle();
			mVelocityTracker = null;
		}
	}

	/**
	 * 
	 * @return 滑动速度，以每秒钟移动了多少像素值为单位。
	 */
	private int getScrollVelocity() {
		mVelocityTracker.computeCurrentVelocity(1000);
		int velocity = (int) mVelocityTracker.getYVelocity();
		return Math.abs(velocity);
	}
}
